package top.mybatisx.sql.core.sql;

import top.mybatisx.sql.core.sql.base.BaseSql;
import top.mybatisx.sql.core.sql.brige.HavingOrderBy;
import top.mybatisx.sql.core.table.QueryColumn;
import top.mybatisx.sql.core.toolkit.Assert;

import java.util.Arrays;

/**
 * 聚合
 */
public interface GroupBy<T extends HavingOrderBy> extends BaseSql {

    // groupBy 部分的sql
    StringBuilder groupBySql = new StringBuilder();


    default T groupBy(QueryColumn... columns) {
        // 加入到查询队列
        groupByList.addAll(Arrays.asList(columns));
        return (T) this;
    }

    default T groupBy(String sql) {
        // 加入到查询队列
        groupBySql.setLength(0);
        groupBySql.append(sql);
        return (T) this;
    }

    default String buildGroupBySql() {
        if (groupBySql.length() > 0 || groupByList.size() == 0) {
            // 如果手工设置了 sql, 直接返回
            return groupBySql.toString();
        }

        // 组装 sql
        groupBySql.setLength(0);
        groupBySql.append(" group by ");
        Assert.notEmpty(groupByList, ".select() 不能为空.请设置查询字段");

        // 组装所有 列
        groupByList.forEach((queryColumn) -> {
            String tableAlias = tableAliasMap.get(queryColumn.getTable().getTableName());
            String columnSql = queryColumn.buildSql(tableAlias);
            groupBySql.append(columnSql);
        });

        // 去掉 列 最后的逗号
        groupBySql.deleteCharAt(groupBySql.length() - 1);
        groupBySql.append(' ');

        return groupBySql.toString();
    }


}
